/**
 * 项目记录合并模块
 * 用于合并发包和中标项目记录
 */

/**
 * 合并项目记录
 * @param {Array} data - 项目数据数组
 * @returns {Array} 合并后的项目数据数组
 */
export function mergeProjectRecords(data) {
  // 创建标记数组，记录每条记录是否已被处理
  const processedFlags = new Array(data.length).fill(false);
  let mergedProjects = [];

  // 遍历所有数据项
  for (let i = 0; i < data.length; i++) {
    // 跳过已处理的项目
    if (processedFlags[i]) continue;

    const currentProject = data[i];
    let mergedProject = { ...currentProject };

    // 寻找可以合并的项目
    for (let j = i + 1; j < data.length; j++) {
      // 跳过已处理的项目
      if (processedFlags[j]) continue;

      const candidateProject = data[j];

      // 检查项目名称是否相同
      if (mergedProject.projectName === candidateProject.projectName) {
        // 验证合并条件
        const canMerge = validateMergeConditions(mergedProject, candidateProject);
        
        if (canMerge) {
          // 合并字段：优先保留非空值和中标信息
          mergeProjectFields(mergedProject, candidateProject);
          // 标记候选项目为已处理
          processedFlags[j] = true;
        }
      }
    }

    // 标记当前项目为已处理并添加到结果中
    processedFlags[i] = true;
    mergedProjects.push(mergedProject);
  }

  return mergedProjects;
}

/**
 * 验证两个项目是否可以合并
 * @param {Object} project1 - 第一个项目
 * @param {Object} project2 - 第二个项目
 * @returns {boolean} 是否可以合并
 */
function validateMergeConditions(project1, project2) {
  // 获取时间信息
  const biddingTime1 = parseDate(project1.biddingTime);
  const winningTime1 = parseDate(project1.winningTime);
  const biddingTime2 = parseDate(project2.biddingTime);
  const winningTime2 = parseDate(project2.winningTime);
  
  // 确定哪个是发包记录，哪个是中标记录
  const isProject1Bidding = biddingTime1 && !winningTime1;
  const isProject2Bidding = biddingTime2 && !winningTime2;
  const isProject1Winning = winningTime1 && !biddingTime1;
  const isProject2Winning = winningTime2 && !biddingTime2;
  
  // 只有发包记录和中标记录才能合并
  if (!((isProject1Bidding && isProject2Winning) || (isProject1Winning && isProject2Bidding))) {
    return false;
  }
  
  // 确定发包时间和中标时间
  const biddingTime = isProject1Bidding ? biddingTime1 : biddingTime2;
  const winningTime = isProject1Winning ? winningTime1 : winningTime2;
  
  // 检查时间条件：中标时间必须晚于发包时间
  if (winningTime <= biddingTime) {
    return false;
  }
  
  // 检查时间条件：中标时间和发包时间必须在一个月内
  const timeDiffInDays = (winningTime - biddingTime) / (1000 * 60 * 60 * 24);
  if (timeDiffInDays > 180) {
    return false;
  }
  
  // 获取金额信息
  const biddingAmount = isProject1Bidding ? parseFloat(project1.totalPrice) : parseFloat(project2.totalPrice);
  const winningAmount = isProject1Winning ? parseFloat(project1.bidAmount) : parseFloat(project2.bidAmount);
  
  // 如果两个金额都存在，检查误差是否在10%以内
  if (!isNaN(biddingAmount) && !isNaN(winningAmount) && biddingAmount > 0) {
    const priceDiffRatio = Math.abs(winningAmount - biddingAmount) / biddingAmount;
    if (priceDiffRatio > 0.1) {
      return false;
    }
  }
  
  return true;
}

/**
 * 解析日期字符串
 * @param {string} dateString - 日期字符串
 * @returns {Date|null} 解析后的日期对象或null
 */
function parseDate(dateString) {
  if (!dateString) return null;
  
  // 尝试解析日期
  const date = new Date(dateString);
  return isNaN(date.getTime()) ? null : date;
}

/**
 * 合并项目字段
 * @param {Object} targetProject - 目标项目
 * @param {Object} sourceProject - 源项目
 */
function mergeProjectFields(targetProject, sourceProject) {
  Object.keys(sourceProject).forEach(key => {
    // 如果目标项目该字段为空，而源项目该字段不为空，则使用源项目的值
    if (!targetProject[key] && sourceProject[key]) {
      targetProject[key] = sourceProject[key];
    }
    
    // 特殊处理：如果目标项目是发包信息，源项目是中标信息，则优先使用中标信息
    if ((key === 'winningTime' || key === 'bidAmount' || key === 'winningBidder') && sourceProject[key]) {
      targetProject[key] = sourceProject[key];
    }
  });
}
